package br.uesc.newigrafu.swing.visao;

import br.uesc.newigrafu.dominio.NewIGrafu;
import br.uesc.newigrafu.swing.controle.ControleJanelaPrincipalNewIGrafu;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Toolkit;

import java.util.HashSet;
import java.util.Set;

import javax.swing.*;

public class JanelaPrincipalNewIGrafu extends JFrame {

    Dimension tamanhoTela = Toolkit.getDefaultToolkit().getScreenSize();
    ControleJanelaPrincipalNewIGrafu controleJanelaPrincipalNewIGrafu;
    NewIGrafu newIGrafu = null;
    // Menu
    JMenuBar barraMenuPrincipal = null;
    JMenu menuArquivo = null;
    JMenu menuConfiguracoes = null;
    JMenu menuEditar = null;
    JMenu menuVisualizar = null;
    JMenu menuAjuda = null;
    JMenuItem itemMenuNovaReconstrucao = null;
    JMenuItem itemMenuCarregarArquivoSequencia = null;
    JMenuItem itemMenuSair = null;
    // Barra de ferramentas
    JToolBar barraFerramentas = null;
    JButton botaoCarregarArquivoSequencia = null;
    JButton botaoNovaReconstrucao = null;
    //Painéis
    JTabbedPane painelAbasReconstrucao = null;
    PainelReconstrucao painelReconstrucao = null;
    Set<PainelReconstrucao> paineisReconstrucao =
            new HashSet<PainelReconstrucao>();

    public JanelaPrincipalNewIGrafu(NewIGrafu _newIGrafu) {
        super("NewIGrafu");
        inicializaJanela();
        newIGrafu = _newIGrafu;
        controleJanelaPrincipalNewIGrafu = new ControleJanelaPrincipalNewIGrafu(
                newIGrafu, this);
        adicionaListeners();
        setVisible(true);
    }

    private void inicializaJanela() {
        setAparencia();
        setTamanhoJanela();
        setPosicaoJanela();
        setJMenuBar(getBarraMenuPrincipal());
        getContentPane().add(getBarraFerramentas(), BorderLayout.PAGE_START);
        getContentPane().add(getPainelAbasReconstrucao());
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    private void setAparencia() {

        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            // UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel");
            // UIManager.setLookAndFeel("com.jtattoo.plaf.mint.MintLookAndFeel");
        } catch (UnsupportedLookAndFeelException e) {
            System.out.println("LookAndFeel não suportado!\n" + e);
        } catch (ClassNotFoundException e) {
            System.out.println("Classe não encontrada!\n" + e);
        } catch (InstantiationException e) {
            System.out.println("Erro de instanciação!\n" + e);
        } catch (IllegalAccessException e) {
            System.out.println("Erro de acesso ilegal!\n" + e);
        }

    }

    private void setTamanhoJanela() {
        JanelaPrincipalNewIGrafu.this.setSize(
                (int) (tamanhoTela.width / 1.8),
                (int) (tamanhoTela.height / 1.8));
    }

    private void setPosicaoJanela() {
        JanelaPrincipalNewIGrafu.this.setLocation(
                (tamanhoTela.width - getSize().width) / 2,
                (tamanhoTela.height - getSize().height) / 2);
    }

    private void adicionaListeners() {
        getBotaoCarregarArquivoSequencia().addActionListener(
                controleJanelaPrincipalNewIGrafu);
        getItemMenuCarregarArquivoSequencia().addActionListener(
                controleJanelaPrincipalNewIGrafu);
        getBotaoNovaReconstrucao().addActionListener(
                controleJanelaPrincipalNewIGrafu);
        getItemMenuNovaReconstrucao().addActionListener(
                controleJanelaPrincipalNewIGrafu);
        getItemMenuSair().addActionListener(
                controleJanelaPrincipalNewIGrafu);
    }

    private JMenuBar getBarraMenuPrincipal() {
        if (barraMenuPrincipal == null) {
            barraMenuPrincipal = new JMenuBar();
            barraMenuPrincipal.setName("barraMenuPrincipal");
            barraMenuPrincipal.add(getMenuArquivo());
            barraMenuPrincipal.add(getMenuConfiguracoes());
            barraMenuPrincipal.add(getMenuEditar());
            barraMenuPrincipal.add(getMenuVisualizar());
            barraMenuPrincipal.add(getMenuAjuda());
        }
        return barraMenuPrincipal;
    }

    public JMenu getMenuArquivo() {
        if (menuArquivo == null) {
            menuArquivo = new JMenu("Arquivo");
            menuArquivo.setName("menuArquivo");
            menuArquivo.add(getItemMenuNovaReconstrucao());
            menuArquivo.add(getItemMenuCarregarArquivoSequencia());
            menuArquivo.add(getItemMenuSair());
        }
        return menuArquivo;
    }

    public JMenuItem getItemMenuNovaReconstrucao() {
        if (itemMenuNovaReconstrucao == null) {
            itemMenuNovaReconstrucao = new JMenuItem(
                    "Nova Reconstrução");
            itemMenuNovaReconstrucao.setName(
                    "itemMenuNovaReconstrucao");
            itemMenuNovaReconstrucao.setActionCommand(
                    "NovaReconstrucao");
            itemMenuNovaReconstrucao.setEnabled(true);
        }
        return itemMenuNovaReconstrucao;
    }

    public JMenuItem getItemMenuCarregarArquivoSequencia() {
        if (itemMenuCarregarArquivoSequencia == null) {
            itemMenuCarregarArquivoSequencia = new JMenuItem(
                    "Carregar sequências");
            itemMenuCarregarArquivoSequencia.setName(
                    "itemMenuCarregarArquivoSequencia");
            itemMenuCarregarArquivoSequencia.setActionCommand(
                    "CarregarArquivoSequencia");
            itemMenuCarregarArquivoSequencia.setEnabled(false);
        }
        return itemMenuCarregarArquivoSequencia;
    }

    public JMenuItem getItemMenuSair() {
        if (itemMenuSair == null) {
            itemMenuSair = new JMenuItem(
                    "Sair");
            itemMenuSair.setName(
                    "itemMenuSair");
            itemMenuSair.setActionCommand(
                    "Sair");
            itemMenuSair.setEnabled(false);
        }
        return itemMenuSair;
    }

    public JMenu getMenuConfiguracoes() {
        if (menuConfiguracoes == null) {
            menuConfiguracoes = new JMenu("Configurações");
            menuConfiguracoes.setName("menuConfiguracoes");
        }
        return menuConfiguracoes;
    }

    public JMenu getMenuEditar() {
        if (menuEditar == null) {
            menuEditar = new JMenu("Editar");
            menuEditar.setName("menuEditar");
        }
        return menuEditar;
    }

    public JMenu getMenuVisualizar() {
        if (menuVisualizar == null) {
            menuVisualizar = new JMenu("Visualizar");
            menuVisualizar.setName("menuVisualizar");
        }
        return menuVisualizar;
    }

    public JMenu getMenuAjuda() {
        if (menuAjuda == null) {
            menuAjuda = new JMenu("Ajuda");
            menuAjuda.setName("menuAjuda");
        }
        return menuAjuda;
    }

    public JToolBar getBarraFerramentas() {
        if (barraFerramentas == null) {
            barraFerramentas = new JToolBar();
            barraFerramentas.setName("barraFerramentas");
            barraFerramentas.setFloatable(false);
            barraFerramentas.add(getBotaoNovaReconstrucao());
            barraFerramentas.add(getBotaoCarregarArquivoSequencia());
        }
        return barraFerramentas;
    }

    public JButton getBotaoCarregarArquivoSequencia() {
        if (botaoCarregarArquivoSequencia == null) {
            botaoCarregarArquivoSequencia = new JButton();
            botaoCarregarArquivoSequencia.setName(
                    "botaoCarregarArquivoSequencia");
            botaoCarregarArquivoSequencia.setIcon(new ImageIcon(
                    JanelaPrincipalNewIGrafu.class.getResource(
                    "imagens/folder.png")));
            botaoCarregarArquivoSequencia.setActionCommand(
                    "CarregarArquivoSequencia");
            botaoCarregarArquivoSequencia.setToolTipText(
                    "Carregar novo arquivo de sequências");
            botaoCarregarArquivoSequencia.setEnabled(false);
        }
        return botaoCarregarArquivoSequencia;
    }

    public JButton getBotaoNovaReconstrucao() {
        if (botaoNovaReconstrucao == null) {
            botaoNovaReconstrucao = new JButton();
            botaoNovaReconstrucao.setName(
                    "botaoReconstruirArvoreManualmente");
            botaoNovaReconstrucao.setIcon(new ImageIcon(
                    JanelaPrincipalNewIGrafu.class.getResource(
                    "imagens/view-refresh.png")));
            botaoNovaReconstrucao.setActionCommand(
                    "NovaReconstrucao");
            // botaoNovaReconstrucao.setEnabled(false);
            botaoNovaReconstrucao.setToolTipText(
                    "Nova Reconstrução");
        }
        return botaoNovaReconstrucao;
    }

    public JTabbedPane getPainelAbasReconstrucao() {
        if (painelAbasReconstrucao == null) {
            painelAbasReconstrucao = new JTabbedPane();
            Dimension dim = new Dimension(
                    (tamanhoTela.width),
                    (tamanhoTela.height - barraFerramentas.getHeight()));
            painelAbasReconstrucao.setSize(dim);
        }
        return painelAbasReconstrucao;
    }

    public void novoPainelReconstrucao() {
        PainelReconstrucao pr = new PainelReconstrucao(newIGrafu);
        paineisReconstrucao.add(pr);
        getPainelAbasReconstrucao().addTab("Reconstrucao " + pr.getID(), pr);
        getPainelAbasReconstrucao().setSelectedComponent(pr);
    }
}
